package com.vates.gestion.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.google.common.base.Preconditions;
import com.vates.gestion.dao.BaseDAO;
import com.vates.gestion.entidades.Cliente;

@Repository(value = "clienteDAO")
public class ClienteDAOImpl implements BaseDAO<Cliente> {

	private EntityManager em;

	/*
	 * Sets the entity manager.
	 */
	@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.em = em;
	}

	@Override
	@Transactional(readOnly = false)
	public void guardar(Cliente entidad) {
		Preconditions.checkNotNull(entidad);
		if (entidad.getId() != null) {
			em.merge(entidad);
		} else {
			em.persist(entidad);
		}

	}

	@Override
	public Cliente buscarPorId(Long id) {
		return em.find(Cliente.class, id);
	}

	@SuppressWarnings("unchecked")
	@Override
	@Transactional(readOnly = true)
	public List<Cliente> buscarTodos() {
		return em.createQuery("select c from Cliente c order by c.id")
				.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	@Transactional(readOnly = true)
	public List<Cliente> buscarPorNombre(String nombre) {
		return em
				.createQuery(
						"select c from Cliente c where c.nombre LIKE :nombre order by c.id")
				.setParameter("nombre", nombre).getResultList();
	}

	@Override
	@Transactional(readOnly = false)
	public void borrar(Cliente entidad) {

		Cliente cliente = em.getReference(entidad.getClass(), entidad.getId());

		em.remove(cliente);
	}

}
